package com.cut;

/**
 * 描述：处理大型数组，按照标记来截取小型数组
 * 返回 小型数组
 * @author LiuLiang
 * @Date 2012-4-28
 */
public class SubJopp {
	/**
	 * 根据传入的 字符数组 data[] 开始标记 startLabel 结束标记 endLabel
	 * 
	 * @param data
	 *            被截取的字符数组 data[]
	 * @param startLabel开始标记
	 *            唯一性的标识 可以是任何字符的组合(字符组保证唯一性)
	 * @param endLabel
	 *            结束标记 唯一性的标识 可以是任何字符的组合(字符组保证唯一性)
	 * @return 根据标记产生的新的数组
	 */
	public static char[] interceptChar(char[] data, String startLabel,
			String endLabel) {
		// 要截取的data的其实位置
		int start = -1;
		int end = -1;
		// 存放截取的数据的容器
		char[] newData = null;
		if (data != null && data.length > 0 && startLabel != null) {
			// 将标签转化成char数组
			char[] charsLabel = startLabel.toCharArray();
			char[] chareLabel = endLabel.toCharArray();
			int labelLen = charsLabel.length;
			// byte数组长度
			int dataLen = data.length;
			// 循环标识
			int i = 0;
			while (i < dataLen) {
				// 判断是否是起始标签
				if (isLabel(data, i, charsLabel)) {
					start = i;
					i += labelLen;
					break;
				} else {
					i++;
				}
			}
			while ((i + labelLen) < dataLen) {
				// 获取结束标签位置
				if (isLabel(data, i, chareLabel)) {
					end = i + labelLen;
					break;
				} else {
					i++;
				}
			}
			// 如果起始位置和结束位置都存在
			if (start != -1 && end != -1 && end > start) {
				// 大小为end-start+结束标签的长度
				int shouldLen = end - start - 2 * labelLen;
				newData = new char[shouldLen];
				// 截取存放
				System.arraycopy(data, start + labelLen, newData, 0, shouldLen);
			}
		}

		return newData;
	}

	/**
	 * @param data
	 *            被截取的数组
	 * @param start
	 *            数组中 被截取的位置
	 * @param charLabel
	 *            截取标识
	 * @return 是否匹配数组中的字符
	 */
	private static boolean isLabel(char[] data, int start, char[] charLabel) {
		boolean islabel = false;
		for (int i = 0; i < charLabel.length; i++) {

			if (data[start + i] == charLabel[i]) {
				if (i == (charLabel.length - 1)) {
					islabel = true;
				}
				continue;
			}

			else {
				islabel = false;
				break;
			}
		}
		return islabel;
	}
}
